﻿#include <windows.h>    

//窗口过程函数的提前声明,用于处理窗口信息
LRESULT CALLBACK myWndProc(HWND hWindow, UINT msg, WPARAM wParam, LPARAM lParam);




//入口函数
/*
* hInstance 当前程序的实例句柄
* iCmdShow: 窗口显示方式(最大化,最小化)
*/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    const static TCHAR appName[] = TEXT("Hello world");
    //窗口注册类
    WNDCLASSEX myWin;
    myWin.cbSize = sizeof(myWin);           //结构体大小
    myWin.style = CS_HREDRAW | CS_VREDRAW;  //窗口变化时,重绘整个客户区
    myWin.lpfnWndProc = myWndProc;          //窗口消息处理函数指针
    myWin.cbClsExtra = 0;                   
    myWin.cbWndExtra = 0;                   //类/窗口额外内存(高级用途)
    myWin.hInstance = hInstance;            //关联的实例句柄
    myWin.hIcon = 0;                        //图标
    myWin.hIconSm = 0;                      //光标    
    myWin.hCursor = 0;                      //
    myWin.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);   //背景画刷(系统窗口颜色)
    myWin.lpszMenuName = 0;                 //菜单资源名
    myWin.lpszClassName = appName;          //唯一类名标识
    //Register      
    if (!RegisterClassEx(&myWin))           //注册到系统
        return 0;
    const HWND hWindow = CreateWindow(
        appName,                //注册的类名
        appName,                //窗口标题
        WS_OVERLAPPEDWINDOW,    //窗口样式(标注带边框)
        CW_USEDEFAULT,          //初始位置
        CW_USEDEFAULT,
        CW_USEDEFAULT,          //宽高
        CW_USEDEFAULT,          
        0,                      //父窗口句柄
        0,                      //菜单句柄
        hInstance,              //程序实例句柄
        0);                     //附加数据
    ShowWindow(hWindow, iCmdShow);  //以指定方式显示窗口
    UpdateWindow(hWindow);          //立即发送WM_PAINT消息 --强制立即重绘客户区,避免初始显示空白
    {
        //消息循环
        /*
        * 输入消息(键盘/鼠标)
        * 系统消息(窗口移动/尺寸变化)
        * 用户自定义消息
        */
        MSG msg;
        while (GetMessage(&msg, 0, 0, 0))
        {
            TranslateMessage(&msg);//转换为键盘消息
            DispatchMessage(&msg);  //将消息分发给窗口过程
        }
        return (int)msg.wParam;     //程序退出码
    }
}
/*
* 窗口过程函数
*/
LRESULT CALLBACK myWndProc(HWND hWindow, UINT msg, WPARAM wParam, LPARAM lParam)
{
    if (msg == WM_PAINT)
    {
        PAINTSTRUCT ps;
        const HDC hDC = BeginPaint(hWindow, &ps);   //获取设备上下文
        RECT rect;
        GetClientRect(hWindow, &rect);              //获取客户区尺寸
        DrawText(hDC, TEXT("HELLO WORLD"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); //居中文本
        EndPaint(hWindow, &ps);     //释放资源
        return 0;
    }
    else if (msg == WM_DESTROY)
    {
        PostQuitMessage(0); //发送WM_QUIT 退出消息循环
        return 0;
    }
    return DefWindowProc(hWindow, msg, wParam, lParam); //默认处理,处理所有未显示处理的消息
}